﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebRamosUC.Models
{
    public class RepositorioProfesor
    {
        private WebRamosUCDataContext db;

        public RepositorioProfesor()
        {
            db = new WebRamosUCDataContext();
        }

        public RepositorioProfesor(WebRamosUCDataContext dataContext)
        {
            this.db = dataContext;
        }

        /// <summary>
        /// Retorna todas los profesores.
        /// </summary>
        public IQueryable<Profesor> AllProfesores()
        {
            return db.Profesors;
        }

        /// <summary>
        /// Retorna el profesor con el nombre dado exacto. No es sensible a mayusculas/minusculas.
        /// </summary>
        public Profesor GetProfesor(string nombre)
        {
            //string nombreUpper = nombre;
            return db.Profesors.SingleOrDefault(d => d.NombreProfesor == nombre);
        }

        /// <summary>
        /// Retorna los profesores con el nombre dado. No es sensible a mayusculas/minusculas.
        /// </summary>
        public IQueryable<Profesor> GetProfesoresNombre(string nombre)
        {
            //string nombreUpper = nombre;
            //return db.Profesors.SingleOrDefault(d => d.NombreProfesor == nombre);
            
            return from profe in db.Profesors
                   where profe.NombreProfesor.Contains(nombre)
                   orderby profe.NombreProfesor
                   select profe;

            
        }

        /// <summary>
        /// Retorna los profesores en que aparecen las palabras del nombre dado en cualquier orden
        /// </summary>
        public IQueryable<Profesor> GetProfesoresNombreSinOrden(string nombre)
        {
            string[] nombres = nombre.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);

            if (nombres.Length > 0)
            {
                IQueryable<Profesor> resultantes = GetProfesoresNombre(nombres[0]);

                for (int i = 1; i < nombres.Length; i++)
                {
                    resultantes = resultantes.Intersect(GetProfesoresNombre(nombres[i]));
                }

                return resultantes;
            }
            else
                return new List<Profesor>().AsQueryable(); //lista vacia
        }

        /// <summary>
        /// Agrega un profesor.
        /// </summary>
        public bool AddProfesor(Profesor profesor)
        {
            db.Profesors.InsertOnSubmit(profesor);

            return true;
        }

        /// <summary>
        /// Guarda los cambios.
        /// </summary>
        public void Save()
        {
            db.SubmitChanges();
        }


        /// <summary>
        /// Retorna los profes mejor evaluados: es decir, los con promedio (de recomendacion) de sus secciones mas altos.
        /// </summary>
        public IQueryable<Profesor> GetProfesoresMejorEvaluados(int cantidad)
        {
            var mejores = from profe in db.Profesors
                          orderby GetSecciones(profe).Average(secc => secc.Recomendaciones.Average(r => (int?)r.Valor)) descending
                          select profe;
            
            return mejores.Take(cantidad);
        }

        // Retorna las secciones que ha dictado este profesor.
        private IQueryable<Seccion> GetSecciones(Profesor profesor)
        {
            return from seccion in db.Seccions
                   where GetProfesores(seccion).Contains(profesor)
                   select seccion;
        }

        //Retorna los profes de la seccion dada
        private IQueryable<Profesor> GetProfesores(Seccion seccion)
        {
            return from profeSecc in db.ProfesorSeccions
                   where profeSecc.IDSeccion == seccion.IDSeccion
                   select profeSecc.Profesor;
        }
    }
}